#include "oj_common/oj_transfer.h"
namespace ojlb {
namespace oj_common {

// public:
void OjTransfer::serialize(const Json::Value& from_root, std::string& to_str, bool indentation) {
    Json::StreamWriterBuilder swb;
    
    if(indentation) {
        swb["indentation"] = ""; // 对 json 字符串进行压缩
    }

    std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());

    std::stringstream ss;
    sw->write(from_root, &ss);
    to_str = ss.str();
}

void OjTransfer::deserialize(const std::string& from_str, Json::Value& to_root) {
    Json::CharReaderBuilder crb;
    std::unique_ptr<Json::CharReader> cr(crb.newCharReader());

    const char* s_temp = from_str.c_str();
    std::string err;
    cr->parse(s_temp, s_temp + strlen(s_temp), &to_root, &err); // 这个有时间查查别的重载, 这个调用捞捞的...
}

void OjTransfer::stringToFile(const std::string& from_str, const std::string& to_file_path/*, const bool& keep*/) { // TODO: keep 是否设置代表是否省略读取 \n
    // 临时解决文件父目录不存在的问题
    size_t pos = to_file_path.find_last_of('/');
    std::string class_dir = (pos == std::string::npos) ? "." : to_file_path.substr(0, pos + 1);
    std::string cmd = "mkdir -p " + class_dir;
    system(cmd.c_str()); // TODO: C/Cpp 竟然没有递归创建文件的好方法...只能等以后寻找了...

    std::ofstream outFile(to_file_path, std::ofstream::trunc); // 打开文件, 不存在则创建, 存在则清空
    if (!outFile.is_open()) { // 检查文件是否成功打开
        OjLog::error("文件 {} 打开出现错误, 请检查文件的状态", to_file_path);
    }

    outFile << from_str;
    outFile.close();
}

void OjTransfer::fileToString(const std::string& from_file_path, std::string& to_str) {
    std::ifstream inFile(from_file_path); // 打开文件
    if (!inFile.is_open()) {  // 检查文件是否成功打开
        OjLog::warn("文件 {} 不存在, 无法读取转化为字符串", from_file_path); // TODO: 这个可以借鉴一下用到别的地方...
        to_str = "";
    }

    std::stringstream buffer;
    buffer << inFile.rdbuf();
    to_str = buffer.str();

    inFile.close();
}


} // namespace oj_common end
} // namespace ojlb end
